#ifndef BOARDWIDGET_H
#define BOARDWIDGET_H

#include <QWidget>
#include <QThread>
#include "AI.h"

namespace Ui {
class BoardWidget;
}

class BoardWidget : public QWidget
{
    Q_OBJECT
public:
    explicit BoardWidget(QWidget *parent = nullptr);
    ~BoardWidget();

signals:
    void signalGameOver(int winner);        // 游戏结束的信号
    void signalPlayerChanged(bool current_player);
    void aiDrop(int*, bool, int, int);

public slots:
    void slotTimeOut();
    void setPredict(int x, int y);
protected:
    void paintEvent(QPaintEvent* event);
    void mouseMoveEvent(QMouseEvent* event);
    void mouseReleaseEvent(QMouseEvent* event);

public:
    void initBoard();  //棋盘初始化函数
private:
    Ui::BoardWidget *ui;

    void setTrackPos(QPoint point);    // 追踪鼠标位置
    void dropPiece(int x, int y);      // 落子

    // 判断输赢
    bool isFivePiece(int x, int y);
    bool isVFivePiece(int x, int y);   // 从(x,y)开始，沿着垂直方向
    bool isHFivePiece(int x, int y);   // 从(x,y)开始，沿着水平方向
    bool isLeftSlash(int x, int y);    // 从(x,y)开始，沿着左对角线
    bool isRightSlash(int x, int y);   // 从(x,y)开始，沿着右对角线
    void checkWinner();

    // 定义变量
    AI* ai;             //  AI指针
    QThread* thread;
    QPoint trackPos;    // 记录鼠标的位置
    bool endGame;       // 标志游戏是否结束
    bool WHITE_PALYER;  // 白色玩家
    bool BLACK_PLAYER;
    bool next_player;   // 下一位玩家

public:
    // 棋盘的大小15x15
    static const int BOARD_WIDTH = 15;
    static const int BOARD_HEIGHT = 15;
    int board[BOARD_WIDTH][BOARD_HEIGHT];   // 定义棋盘

    //棋盘起始的的位置  行和列
    static const QPoint ROW_NUM_START;
    static const QPoint COLUMN_NUM_START;

    // size
    static const QSize WIDGET_SIZE;
    static const QSize CELL_SIZE;

    static const QPoint START_POS;
    static const int NO_PIECE = 0;     // 用于标记棋盘中某个位置没有棋子

    // 定义玩家
    static const int WHITE_PIECE = -1;   // 白棋
    static const int BLACK_PIECE = 1;   // 黑棋

    //定义上一次下棋的位置
    int eraser_x = -100;
    int eraser_y = -100;


};

#endif  // BOARDWIDGET_H
